#[test]
fn test_group_anagrams() {
    assert_eq!(
        group_anagrams(vec!["".to_string()]),
        vec![vec!["".to_string()]]
    );

    assert_eq!(
        group_anagrams(vec!["a".to_string()]),
        vec![vec!["a".to_string()]]
    );

    assert_eq!(
        group_anagrams(vec![
            "eat".to_string(),
            "tea".to_string(),
            "tan".to_string(),
            "ate".to_string(),
            "nat".to_string(),
            "bat".to_string()
        ]),
        vec![
            vec!["bat".to_string()],
            vec!["eat".to_string(), "tea".to_string(), "ate".to_string()],
            vec!["tan".to_string(), "nat".to_string()]
        ]
    );
}

/*
49. 字母异位词分组
给定一个字符串数组，将字母异位词组合在一起。可以按任意顺序返回结果列表。
字母异位词指字母相同，但排列不同的字符串。

示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:
输入: strs = [""]
输出: [[""]]

示例 3:
输入: strs = ["a"]
输出: [["a"]]

提示：
1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i] 仅包含小写字母
*/
pub fn group_anagrams(strs: Vec<String>) -> Vec<Vec<String>> {
    strs.into_iter()
        .fold(std::collections::BTreeMap::new(), |mut map, s| {
            let mut key = std::collections::BTreeMap::new();
            s.as_bytes()
                .iter()
                .for_each(|&c| *key.entry(c).or_insert(0) += 1);
            map.entry(key).or_insert(vec![]).push(s);
            map
        })
        .into_iter()
        .map(|(_, v)| v)
        .collect()
}
